package demo1;
import javax.lang.model.element.Name;
import java.util.Arrays;
import java.util.Objects;
//自定义类实例化出的对象的比较
class Stu implements Comparable<Stu>{//Comparable接口有两个作用，一是手动比较两个对象二是与sort合作，实现排序一堆对象
    public String name;
    public int age;
    public Stu(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString(){
        return "Student{"+"name="+this.name+"age="+this.age+'}';
    }

    public int compareTo(Stu a) {

        return this.age-a.age;//自定义比较方法
        //this所指的对象时调用compareTo方法这个对象，o所指对象指括号里对象
    }
    //重写equal方法
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if(o==null||this.getClass()!=o.getClass()){//this。getClass指获取当前this所指对象的类型是否与传入对象同类
            return false;
        }
        Stu stu=(Stu) o;
        return this.age== stu.age&&Objects.equals(this.name,stu.name);//自定义比较规则

    }
    @Override
    public int hashCode() {
        return Objects.hash(this.name,this.age);//hash()是Objects工具类里的方法
    }
}
public class Test82 {

    public static void mysort(Comparable[] cm){
        for(int i=0;i<cm.length;i++){
            for(int j=0;j< cm.length-i-1;j++){
                if(cm[j].compareTo(cm[j+1])<0){//升序排序
                    Comparable popo=cm[j];
                    cm[j]=cm[j+1];
                    cm[j+1]=popo;
                }
            }
        }

    }
    public static void main(String[] args) {
        Stu stu1 = new Stu("花花", 10);
        Stu stu2 = new Stu("白白", 12);
        System.out.println("两个学生一样：" + stu1.equals(stu2));//第一种方法：用此方法比较两个对象必须重写比较方法否则默认比较两个对象的地址
        System.out.println("花花比白白的年纪大"+stu1.compareTo(stu2)+"岁");//第二种方法借助CompareTo接口调用重写方法比较两个对象
        Stu stu7=new Stu("蛤蛤",14);
        Stu stu8=new Stu("咕咕",16);
        AgeComparator age1=new AgeComparator();
        int ret =age1.compare(stu7,stu8);
        System.out.println("stu7学生比stu8学生大"+ret+"岁");
        //用数组进行排序
        //排序一堆对象用sort有两种方法，否则不成
        Stu []stu=new Stu[3];
        stu[0]=new Stu("小小",15);
        stu[1]=new Stu("爱米",14);
        stu[2]=new Stu("飞飞",13);
        System.out.println("排序前："+Arrays.toString(stu));
        Arrays.sort(stu);
        System.out.println("排序后"+Arrays.toString(stu));//sort与Comparator（临时指定规则）或与类实现的接口Comparable合作才可排序一堆对象，
        // 此处sort方法执行类实现接口的重写的compare【内容按年纪排序】方法
        NameComparator name=new NameComparator();
        AgeComparator  age=new AgeComparator();//手动调用比较器
        Arrays.sort(stu,age);//传入要比较的对象和含比较规则的类实例化的对象
        System.out.println("排序后"+Arrays.toString(stu));
        //排序一堆对象的第三种方法自己写冒泡排序
        Stu []stu9=new Stu[3];
        stu9[0]=new Stu("扣扣",19);
        stu9[1]=new Stu("默默",15);
        stu9[2]=new Stu("破破",16);
        mysort(stu9);
        System.out.println("自写冒泡排序排列后"+Arrays.toString(stu9));
    }
}
